package io.github.lhdxhl.wechatpay.result;

import io.github.lhdxhl.wechatpay.model.GoodModel;
import io.github.lhdxhl.wechatpay.model.RefundFromModel;
import io.github.lhdxhl.wechatpay.model.RefundGoodsModel;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @author lsk
 * @version 1.0.0
 * @ClassName WxRefundResult.java
 * @Description 退款请求返回的数据模板
 * @createTime 2022年10月02日 10:08:00
 */
public class WxRefundResult implements Serializable {
    /**
     * 微信支付退款单号
     */
    private String refundId;

    /**
     * 商户退款单号
     */
    private String outRefundNo;

    /**
     * 微信支付订单号
     */
    private String transactionId;

    /**
     * 商户订单号
     */
    private String outTradeNo;

    /**
     * 退款渠道 枚举值：
     * ORIGINAL：原路退款
     * BALANCE：退回到余额
     * OTHER_BALANCE：原账户异常退到其他余额账户
     * OTHER_BANKCARD：原银行卡异常退到其他银行卡
     */
    private String channel;

    /**
     * 退款入账账户
     * 取当前退款单的退款入账方，有以下几种情况：
     * 1）退回银行卡：{银行名称}{卡类型}{卡尾号}
     * 2）退回支付用户零钱:支付用户零钱
     * 3）退还商户:商户基本账户商户结算银行账户
     * 4）退回支付用户零钱通:支付用户零钱通
     */
    private String userReceivedAccount;

    /**
     * 退款成功时间，当退款状态为退款成功时有返回。
     * 示例值：2020-12-01T16:18:12+08:00
     */
    private String successTime;

    /**
     * 退款受理时间
     * 示例值：2020-12-01T16:18:12+08:00
     */
    private String createTime;

    /**
     * 退款状态
     * 退款到银行发现用户的卡作废或者冻结了，导致原路退款银行卡失败，可前往商户平台-交易中心，手动处理此笔退款。
     * 枚举值：
     * SUCCESS：退款成功
     * CLOSED：退款关闭
     * PROCESSING：退款处理中
     * ABNORMAL：退款异常
     */
    private String status;

    /**
     * 账户资金
     * 退款所使用资金对应的资金账户类型
     * 枚举值：
     * UNSETTLED : 未结算资金
     * AVAILABLE : 可用余额
     * UNAVAILABLE : 不可用余额
     * OPERATION : 运营户
     * BASIC : 基本账户（含可用余额和不可用余额）
     */
    private String fundsAccount;

    /**
     * 金额信息
     */
    private RefundAmountResult amount;


    /**
     * 优惠退款信息
     */
    private List<PromotionDetailResult> promotionDetail;


    /**
     * @author lsk
     * @version 1.0.0
     * @ClassName RefundAmountResult.java
     * @Description 退款金额请求返回的数据模板
     * @createTime 2022年10月02日 10:08:00
     */
    @Data
    public static class RefundAmountResult{

        /**
         * 原订单金额，币种的最小单位，只能为整数，不能超过原订单支付金额。
         */
        private Integer total;
        /**
         * 符合ISO 4217标准的三位字母代码，目前只支持人民币：CNY。
         */
        private String currency = "CNY";
        /**
         * 退款金额，币种的最小单位，只能为整数，不能超过原订单支付金额。
         */
        private Integer refund;

        /**
         * 退款出资账户及金额
         */
        private List<RefundFromModel> form;

        /**
         * 现金支付金额，单位为分，只能为整数
         */
        private Integer payerTotal;

        /**
         * 退款给用户的金额，不包含所有优惠券金额
         */
        private Integer payerRefund;

        /**
         * 去掉非充值代金券退款金额后的退款金额，单位为分，退款金额=申请退款金额-非充值代金券退款金额，退款金额<=申请退款金额
         */
        private Integer settlementRefund;

        /**
         * 应结订单金额=订单金额-免充值代金券金额，应结订单金额<=订单金额，单位为分
         */
        private Integer settlementTotal;

        /**
         * 优惠退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为现金，说明详见代金券或立减优惠，单位为分
         */
        private Integer discountRefund;

        /**
         * 手续费退款金额，单位为分。
         */
        private Integer refundFee;
    }

    /**
     * @author lsk
     * @version 1.0.0
     * @ClassName PromotionDetailResult.java
     * @Description 优惠信息退款记录
     * @createTime 2022年10月02日 10:08:00
     */
    @Data
    public static class PromotionDetailResult{
        /**
         * 券ID
         */
        private String promotionId;

        /**
         * 优惠范围：
         * GLOBAL：全场代金券
         * SINGLE：单品优惠
         */
        private String scope;

        /**
         * 优惠范围：
         *CASH：充值型代金券
         *NOCASH：免充值型代金券
         */
        private String type;

        /**
         * 优惠券面额
         */
        private int amount;

        /**
         * 优惠币种
         */
        private String currency;

        /**
         * 优惠退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为用户支付的现金，说明详见代金券或立减优惠，单位为分
         */
        private Integer refundAmount;

        /**
         * 单品列表
         */
        private  List<RefundGoodsModel> goodsDetail;

    }




}
